package com.jdwx.opengl.kotlin

import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
import kotlinx.coroutines.selects.*

//fun CoroutineScope.fizz() = produce<String> {
//    while (true) { // 每 300 毫秒发送一个 "Fizz"
//        delay(300)
//        send("Fizz")
//    }
//}
//
//fun CoroutineScope.buzz() = produce<String> {
//    while (true) { // 每 500 毫秒发送一个 "Buzz!"
//        delay(500)
//        send("Buzz!")
//    }
//}
//
//suspend fun selectFizzBuzz(fizz: ReceiveChannel<String>, buzz: ReceiveChannel<String>) {
//    select<Unit> { // <Unit> 意味着该 select 表达式不返回任何结果
//        fizz.onReceive { value ->  // 这是第一个 select 子句
//            println("fizz -> '$value'")
//        }
//        buzz.onReceive { value ->  // 这是第二个 select 子句
//            println("buzz -> '$value'")
//        }
//    }
//}
//
//fun main() = runBlocking<Unit> {
//    val fizz = fizz()
//    val buzz = buzz()
//    repeat(7) {
//        selectFizzBuzz(fizz, buzz)
//    }
//    coroutineContext.cancelChildren() // 取消 fizz 和 buzz 协程
//
//}


//suspend fun selectAorB(a: ReceiveChannel<String>, b: ReceiveChannel<String>): String =
//        select<String> {
//            a.onReceiveOrNull { value: String? ->
//                if (value == null)
//                    "Channel 'a' is closed"
//                else
//                    "a -> '$value'"
//            }
//            b.onReceiveOrNull { value: String? ->
//                if (value == null)
//                    "Channel 'b' is closed"
//                else
//                    "b -> '$value'"
//            }
//        }
//
//fun main() = runBlocking<Unit> {
//    val a = produce<String> {
//        repeat(4) { send("Hello $it") }
//    }
//    val b = produce<String> {
//        repeat(4) { send("World $it") }
//    }
//    repeat(8) { // 打印最早的八个结果
//        println(selectAorB(a, b))
//    }
//    coroutineContext.cancelChildren()
//}


